#include "link_list.h"

linklist_t * create_linklist(){
	linklist_t *l = (linklist_t *)malloc(sizeof(linklist_t));
	return l;
}

linklist_t * create_list_node(data_t data){
	linklist_t *node = (linklist_t *)malloc(sizeof(linklist_t));
	if(NULL != node){
		node->data = data;
		node->next = NULL;
	}
	return node;
}

int is_empty_linklist(linklist_t *l){
	if(NULL == l){
		return -1;
	}
	
	return (NULL == l->next);
}

int insert_list(linklist_t *l, int pos, data_t data){
	if(NULL == l){
		return -1;
	}
	linklist_t *q = l;
	
	int len = 0;
	while(q->next){
		len++;
		q = q->next;
	}
	if(pos < 0 || pos > len){
		return -1;
	}

	linklist_t *node = create_list_node(data);
	if(NULL == node){
		return -1;
	}

	q = l;
	int i = 0;
	while(i < pos){
		q = q->next;
		i++;
	}

	node->next = q->next;
	q->next = node;

	return 1;
}

data_t get_list_node_data(linklist_t *l, int pos){
	if(NULL == l){
		return NULL;
	}
	linklist_t *q = l;
	int len = 0;
	while(q->next){
		len++;
		if(pos == len){
			return q->next->data;
		}
		q = q->next;
	}
	return NULL;
}

int delete_list_node(linklist_t *l, data_t data){
	if(NULL == l){
		return -1;
	}

	int i = 0;
	linklist_t *node = NULL;
	while(l->next){
		if(l->next->data == data){
			node = l->next;
			l->next = l->next->next;
			node->next = NULL;
			free(node);
			node = NULL;
			i++;
		}
		l = l->next;
	}
	return i;
}

void reverse_linklist(linklist_t *l){
	if(NULL == l){
		return;
	}
	linklist_t *p = l->next;
	l->next = NULL;
	linklist_t *q;

	while(p){
		q = p->next;
		p->next = l->next;
		l->next = p;
		p = q;
	}
}

void * destroy_linklist(linklist_t **l){
	
	linklist_t *h = *l;

	if(NULL == *l || NULL == l){
		return NULL;
	}

	linklist_t *p;
	while(h->next){
		p = h->next;
		h->next = p->next;

		free(p);
		p = NULL;
	}

	free(h);
	h = NULL;
	
	*l = NULL;

	return NULL;
}
